package com.zys.service.impl;

import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zys.domain.User;
import com.zys.excel.UserData;
import com.zys.properties.SftpProperties;
import com.zys.service.UserService;
import com.zys.mapper.UserMapper;
import com.zys.utils.PageParam;
import com.zys.vo.UserQueryParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;


@Service
@RequiredArgsConstructor
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    private final UserMapper userMapper;

    private final SftpProperties sftpProperties;

    /**
     * 上传xlsx文件到sftp服务器,上传后转为csv格式查看
     */

//    @Override
//    public void export() {
//        final String localPath ="C:\\Users\\77052\\Desktop\\user.xlsx";
//        try {
//            List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().select());
//            ExcelWriter writer = ExcelUtil.getWriter(localPath);
//            List<String> head = Arrays.asList(UserConstant.HEAD);
//            Sheet sheet = writer.getSheet();
//            for (int i = 0; i < 4; i++) {
//                sheet.setColumnWidth(i, 20 * 256);
//            }
//            writer.writeHeadRow(head);
//            List<List<Object>> rows = new ArrayList<>();
//            for (User user : users) {
//                List<Object> row = new ArrayList<>();
//                row.add(user.getId());
//                row.add(user.getName());
//                row.add(user.getAge());
//                rows.add(row);
//            }
//            writer.write(rows);
//            writer.close();
//            log.info("导出成功");
//            log.info("开始上传到sftp");
//            Session session = JschUtil.openSession(sftpProperties.getHost(), sftpProperties.getPort(), sftpProperties.getUsername(), sftpProperties.getPassword());
//            ChannelSftp channelSftp = JschUtil.openSftp(session);
//            String remotePath = sftpProperties.getRemotePath() + "/user.xlsx";
//            channelSftp.setFilenameEncoding("UTF-8");
//            // 使用InputStream方式确保以二进制模式传输
//            channelSftp.put(localPath,remotePath);
//            channelSftp.exit();
//            channelSftp.disconnect();
//            log.info("上传成功");
//        }catch (Exception e){
//            e.printStackTrace();
//            log.error("导出失败",e);
//        }
//    }
//    @Override
//    public void export() {
//        LocalDate dateBegin = LocalDate.now().minusDays(30);
//        LocalDate dateEnd = LocalDate.now().minusDays(1);
//        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
//                .between(User::getCreateTime, LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX)));
//
//        InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/用户数据表.xlsx");
//        try {
//            XSSFWorkbook excel = new XSSFWorkbook(in);
//            XSSFSheet sheet = excel.getSheetAt(0);
//
//            // 设置时间范围
//            sheet.getRow(1).getCell(1).setCellValue("时间：" + dateBegin + "至" + dateEnd);
//
//            // 计算age总和
//            int totalAge = users.stream().mapToInt(User::getAge).sum();
//            log.info("totalAge:{}",totalAge);
//            XSSFRow row = sheet.getRow(3);
//            row.getCell(2).setCellValue(users.size());
//            if(row.getCell(4) == null){
//                row.createCell(4);
//            }
//            row.getCell(4).setCellValue(totalAge);
//
//
//            // 填充用户数据
//            for (int i = 0; i < users.size(); i++) {
//                row = sheet.getRow(7 + i);
//                row.getCell(1).setCellValue(users.get(i).getCreateTime().toString());
//                row.getCell(2).setCellValue(users.get(i).getName());
//                row.getCell(3).setCellValue(users.get(i).getAge());
//            }
//
//            // 定义保存路径，这里假设你想保存到桌面，需要根据操作系统不同进行调整
//            String desktopPath = "C:\\Users\\77052\\Desktop\\用户数据表.xlsx";
//            FileOutputStream fileOut = new FileOutputStream(desktopPath);
//            excel.write(fileOut);
//
//            // 关闭资源
//            fileOut.close();
//            excel.close();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
    @Override
    public void export() {
//        LocalDate dateBegin = LocalDate.now().minusDays(30);
//        LocalDate dateEnd = LocalDate.now().minusDays(1);
//        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
//                .between(User::getCreateTime, LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX)));
//
//        try (InputStream in = this.getClass().getClassLoader().getResourceAsStream("templates/用户数据表.xlsx")) {
//            if (in == null) {
//                log.error("模板文件未找到: template/用户数据表.xlsx");
//                return;
//            }
//
//            try (XSSFWorkbook excel = new XSSFWorkbook(in)) {
//                XSSFSheet sheet = excel.getSheetAt(0);
//
//                // 确保行和单元格不为null
//                XSSFRow row1 = sheet.getRow(1);
//                if (row1 != null && row1.getCell(1) != null) {
//                    row1.getCell(1).setCellValue("时间：" + dateBegin + "至" + dateEnd);
//                } else {
//                    log.warn("第2行第2列单元格不存在");
//                }
//
//                int totalAge = users.stream().mapToInt(User::getAge).sum();
//                XSSFRow row3 = sheet.getRow(3);
//                if (row3 != null) {
//                    if (row3.getCell(2) == null) {
//                        row3.createCell(2);
//                    }
//                    row3.getCell(2).setCellValue(users.size());
//
//                    // 确保第5个单元格（索引为4）存在
//                    if (row3.getCell(4) == null) {
//                        row3.createCell(4);
//                    }
//                    row3.getCell(4).setCellValue(totalAge);
//                } else {
//                    log.warn("第4行不存在");
//                }
//                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//
//
//                for (int i = 0; i < users.size(); i++) {
//                    Date createTime = users.get(i).getCreateTime();
//                    String formatted = format.format(createTime);
//                    XSSFRow dataRow = sheet.getRow(7 + i);
//                    if (dataRow == null) {
//                        dataRow = sheet.createRow(7 + i);
//                    }
//
//                    if (dataRow.getCell(1) != null) {
//                        dataRow.getCell(1).setCellValue(formatted);
//                    } else {
//                        dataRow.createCell(1).setCellValue(formatted);
//                    }
//
//                    if (dataRow.getCell(2) != null) {
//                        dataRow.getCell(2).setCellValue(users.get(i).getName());
//                    } else {
//                        dataRow.createCell(2).setCellValue(users.get(i).getName());
//                    }
//
//                    if (dataRow.getCell(3) != null) {
//                        dataRow.getCell(3).setCellValue(users.get(i).getAge());
//                    } else {
//                        dataRow.createCell(3).setCellValue(users.get(i).getAge());
//                    }
//                }
//
//                String desktopPath = "C:\\Users\\77052\\Desktop\\用户数据表.xlsx";
//                try (FileOutputStream fileOut = new FileOutputStream(desktopPath)) {
//                    excel.write(fileOut);
//                    log.info("文件已保存到: " + desktopPath);
//                }
//            }
//        } catch (Exception e) {
//            log.error("导出失败", e);
//        }
    }

    @Override
    public void download(HttpServletResponse response) {
        try
        {
            // 查询数据
            List<User> users = userMapper.selectList(null
            );

            // 指定服务器上的文件保存路径
            String filePath = "D:\\users.xlsx"; // 修改为你想要保存的路径

            // 使用 EasyExcel 写入文件到服务器本地路径
            EasyExcel.write(filePath, UserData.class).sheet("模板"
            ).doWrite(users);

//            // 设置响应头，告诉浏览器这是一个文件下载请求
//            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
//            );
//            response.setCharacterEncoding("utf-8"
//            );
//
//            // 防止中文乱码
//            String fileName = URLEncoder.encode("用户表", "UTF-8").replaceAll("\\+", "%20"
//            );
//            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"
//            );
//
//            // 将文件从服务器路径读取并写入到响应流中
//            FileInputStream fileInputStream = new
//                    FileInputStream(filePath);
//            OutputStream outputStream = response.getOutputStream();
//            byte[] buffer = new byte[1024
//                    ];
//            int
//                    bytesRead;
//            while ((bytesRead = fileInputStream.read(buffer)) != -1
//            ) {
//                outputStream.write(buffer, 0
//                        , bytesRead);
//            }
//
//            // 关闭流
//            fileInputStream.close();
//            outputStream.flush();
//            outputStream.close();
            log.info("文件下载成功");
        } catch
        (Exception e) {
            log.error("下载失败"
                    , e);
            throw new RuntimeException("下载失败"
            );
        }
    }

    @Override
    public IPage<User> getList(PageParam<User> param, UserQueryParam queryParam) {
        IPage<User> page = userMapper.getPage(param,queryParam);
        log.info(String.valueOf(page.getTotal()));
        return page;
    }

}




